// #include <stdio.h>
// #include <stdlib.h>
// #include <assert.h>
// #include "windows.h"
// // 节点结构
// typedef struct DLinkNode {
//     int data; // 存储数据
//     struct DLinkNode* next; // 指向下一个节点
//     struct DLinkNode* prev; // 指向前一个节点
// } DLinkNode;
//
// // 链表结构
// typedef struct DLinkList {
//     DLinkNode* head; // 指向头节点
// } DLinkList;
//
// // 初始化循环双链表
// DLinkList* DLinkInit() {
//     DLinkList* list = (DLinkList*)malloc(sizeof(DLinkList));
//     if (list == NULL) {
//         perror("malloc failed");
//         exit(EXIT_FAILURE);
//     }
//     list->head = (DLinkNode*)malloc(sizeof(DLinkNode));
//     if (list->head == NULL) {
//         perror("malloc failed");
//         exit(EXIT_FAILURE);
//     }
//     list->head->next = list->head; // 初始化为循环链表
//     list->head->prev = list->head;
//     return list;
// }
//
// // 插入节点到循环双链表尾部
// void DLinkInsert(DLinkList* list, int data) {
//     assert(list);
//     DLinkNode* newNode = (DLinkNode*)malloc(sizeof(DLinkNode));
//     if (newNode == NULL) {
//         perror("malloc failed");
//         exit(EXIT_FAILURE);
//     }
//     newNode->data = data;
//
//     DLinkNode* tail = list->head->prev; // 找到尾节点
//     tail->next = newNode; // 尾节点的next指向新节点
//     newNode->prev = tail; // 新节点的prev指向尾节点
//     newNode->next = list->head; // 新节点的next指向头节点
//     list->head->prev = newNode; // 头节点的prev指向新节点
// }
//
// // 删除循环双链表中的节点
// void DLinkDelete(DLinkList* list, int data) {
//     assert(list);
//     DLinkNode* current = list->head->next;
//     while (current != list->head) {
//         if (current->data == data) {
//             current->prev->next = current->next; // 前驱节点的next指向后继节点
//             current->next->prev = current->prev; // 后继节点的prev指向前驱节点
//             free(current);
//             return;
//         }
//         current = current->next;
//     }
// }
//
// // 查找循环双链表中的节点
// DLinkNode* DLinkFind(DLinkList* list, int data) {
//     assert(list);
//     DLinkNode* current = list->head->next;
//     while (current != list->head) {
//         if (current->data == data) {
//             return current;
//         }
//         current = current->next;
//     }
//     return NULL; // 未找到
// }
//
// // 打印循环双链表
// void DLinkPrint(DLinkList* list) {
//     assert(list);
//     DLinkNode* current = list->head->next;
//     while (current != list->head) {
//         printf("%d ", current->data);
//         current = current->next;
//     }
//     printf("\n");
// }
//
// // 销毁循环双链表
// void DLinkDestroy(DLinkList* list) {
//     assert(list);
//     DLinkNode* current = list->head->next;
//     while (current != list->head) {
//         DLinkNode* next = current->next;
//         free(current);
//         current = next;
//     }
//     free(list->head);
//     free(list);
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     DLinkList* list = DLinkInit();
//
//     // 插入数据到循环双链表
//     DLinkInsert(list, 1);
//     DLinkInsert(list, 2);
//     DLinkInsert(list, 3);
//     DLinkInsert(list, 4);
//
//     printf("循环双链表内容: ");
//     DLinkPrint(list);
//
//     // 查找节点
//     DLinkNode* found = DLinkFind(list, 3);
//     if (found) {
//         printf("找到节点，数据为: %d\n", found->data);
//     } else {
//         printf("未找到节点\n");
//     }
//
//     // 删除节点
//     DLinkDelete(list, 2);
//     printf("删除节点后，循环双链表内容: ");
//     DLinkPrint(list);
//
//     // 销毁循环双链表
//     DLinkDestroy(list);
//
//     return 0;
// }